#/usr/bin/perl
#<<DOC; 
#Votre Nom : BLANCHARD Lucille-DUFOUR Manuela
#JANVIER 2015
# usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
# Le programme prend en entrée le nom du répertoire contenant les fichiers
# à traiter
# Le programme construit en sortie 
# un fichier structuré contenant sur chaque ligne le nom du fichier et le résultat du filtrage :
# <FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
# un fichier txt
# un fichier en xml étiqueté via tree-tagger
#---------------------------------------------------#entrée du répertoire
use Unicode::String qw (utf8);
use Data::Dumper;
use strict;
use warnings;

my $description=();
my $titre=();
my $encodagesortie1 = "utf-8";
my $encodagesortie2="iso-8859-1";
my %dico_titre=();
my %dico_desc=();
my $rep="$ARGV[0]"; 
my $rub = "$ARGV[1]";
$rep=~ s/[\/]$//; 
#----------------------------------------#préparation des fichiers de sortie
my $output1="SORTIE$rub.xml";
if (!open (OUT1,">:encoding($encodagesortie1)",$output1)) { die "Pblm a l'ouverture du fichier $output1"}; 
print OUT1 "<?xml version=\"1.0\" encoding=\"utf8\" ?>\n";
print OUT1 "<PARCOURS>\n";
print OUT1 "<NOM>Blanchard_Dufour</NOM>\n";
print OUT1 "<FILTRAGE>\n";

my $output2="SORTIE$rub.txt";
if (!open (OUT2,">:encoding($encodagesortie2)",$output2)) { die "Pb a l'ouverture du fichier $output2"}; 
#----------------------------------------
&parcoursarborescencefichiers($rep);	
#----------------------------------------#fin des fichiers de sortie
print OUT1 "</FILTRAGE>\n";
print OUT1 "</PARCOURS>\n";
close(OUT1);
close(OUT2);
exit;
#----------------------------------------------
sub parcoursarborescencefichiers 
{
    my $path = shift(@_); #enregistrement du chemin de $rep dans la variable $path
    opendir(DIR, $path) or die "can't open $path: $!\n"; 
    my @files = readdir(DIR); 
    closedir(DIR);
    foreach my $file (@files)     
    {
        next if $file =~ /^\.\.?$/; #si le fic trouvé correpond à . ou .. va au suivant
        $file = $path."/".$file; #reconstruit le chemin pour le programme par rapport à ma position
        if (-d $file) 	
        { 
            &parcoursarborescencefichiers($file);	
        }
        if (-f $file) 
        {
            my $encodageentree = `file -i $file | cut -d= -f2`;
            print "ENCODAGE : $encodageentree\n";
            chomp ($encodageentree);

            if (($file =~ /.+$rub.+\.xml$/) and (-s $file !=0))  
            {
                print $file,"\n";
                open(FILE, $file);
                my $line =<FILE>;
                close (FILE);
                $line=~/encoding=[\'\"]([^\"\']+)[\'\"]/; # encoding est parfois suivi de "" ou ''
                my $encodage=$1; 
                open(FILE, "<:encoding($encodage)", $file); #spécifie l'encodage du fichier 
                my $chainecomplete = "";
                while ($line = <FILE>) 
                {
                    chomp $line; 
                    $chainecomplete = $chainecomplete ." ". $line ; 
                }
                $chainecomplete=~ s/> +</></g;
		#-----------------------------------------
                while ($chainecomplete =~ /<item><title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>/g)  
                {
                    my $titre = $1;
                    my $description = $2;
                    if (uc($encodage) ne "UTF-8")
                    {
                        utf8($titre);
                        utf8($description);
                    }
                    if ((!(exists $dico_titre{$titre})) and (!(exists $dico_desc{$description}))) 
                    {
                        $dico_titre{$titre}++;
                        $dico_desc{$description}++;
                        $titre=&nettoyage($titre); 
                        $description=&nettoyage($description);
			
                        print OUT2 "$titre.\n$description.\x{00A7}\n";
                        print OUT1 "<item><title>$titre</title>\n<description>$description</description></item>\n";
                    }   
                    else 
                    {
                        print "Item déjà vu\n";
                    }
                }
                close (FILE);
            }
        }
    }
}
#----------------------------------------------
#traitement de nettoyage répété
sub nettoyage 
{
    my $chainetrouvee = shift@_; #my chainetrouvee est locale, n'existe qu'ici; shift supprime le premier élément et le renvoie
    $chainetrouvee=~s /&#38;#39;/'/g;
    $chainetrouvee=~s /&#39;/'/g;
    $chainetrouvee=~s /&#38;#34;/"/g;
    $chainetrouvee=~s /&#34;/"/g;
	$chainetrouvee=~s /&#91;/[/g;
	$chainetrouvee=~s /&#93;/]/g;
	$chainetrouvee=~s /&#233;/é/g;
	$chainetrouvee=~s /e\x{0301}/é/g;
	$chainetrouvee=~s /e\x{0300}/è/g;
	$chainetrouvee=~s /&#234;/ê/g;
	$chainetrouvee=~s /\x{0119}/ę/g;
	$chainetrouvee=~s/\x{2192}/→/g;
	$chainetrouvee=~s/\x{201c}/"/g;
	$chainetrouvee=~s /âœ/"/g;
	$chainetrouvee=~s/\x{201d}/"/g;
	$chainetrouvee=~s /â/"/g;
	$chainetrouvee=~s /âÅ/"/g;
	$chainetrouvee=~s/\x{2019}/'/g;
	$chainetrouvee=~s/\x{2018}/'/g;
	$chainetrouvee=~s/\x{2013}/-/g;
	$chainetrouvee=~s/\x{2014}|â/-/g;
	$chainetrouvee=~s/\x{2212}/-/g; 
	$chainetrouvee=~s /\x{2026}/.../g;
	$chainetrouvee=~s /\x{0153}/oe/g;
	$chainetrouvee=~s /\x{0152}/Œ/g;
	$chainetrouvee=~s /\x{0096}/-/g;
	$chainetrouvee=~s /\x{009C}/oe/g;
	$chainetrouvee=~s /\x{0093}/oe/g;
	$chainetrouvee=~s /\x{200a}/ /g;
	$chainetrouvee=~s /\x{200b}/ /g;
	$chainetrouvee=~s /ÅÅ/oe/g;
	$chainetrouvee=~s /Å/oe/g;
	$chainetrouvee=~s /&/and/g;
	$chainetrouvee=~s /"/"/g;
	$chainetrouvee=~s/\x{20ac}/€/g;
	$chainetrouvee=~s /\x{305a}\x{305a}\x{3063}\x{3068}/ずずっと/g;
	$chainetrouvee=~s/\x{2009}/ /g; #espace court
	$chainetrouvee=~s/\x{fffd}/�/g;
	$chainetrouvee=~s /&lt;.*?&gt;//g;
	$chainetrouvee=~s /<img.*?\/>//g;
	$chainetrouvee=~s /<a href.*?><\/a>//g;
	$chainetrouvee=~s /<p>&nbsp;&nbsp;\n<\/p>//g;
	$chainetrouvee=~s /<[^<]*>//g;
	$chainetrouvee=~s /andlt.*//g;
	$chainetrouvee=~s /&lt.*//g;
    return $chainetrouvee; # renvoie le résultat du nettoyage, plus haut, après l'execution du nettoyage
}
#-----------------------------------------------------------------------------
#FIN
 
